package com.right.service.impl;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import com.Tools.DBTools;
import com.Tools.PageData;
import com.right.dao.OrderdetailDao;
import com.right.dao.OrdersDao;
import com.right.dao.impl.OrderdetailDaoImp;
import com.right.dao.impl.OrdersDaoImpl;
import com.right.entity.Cart;
import com.right.entity.Orderdetail;
import com.right.entity.Orders;
import com.right.service.OrdersService;

public class OrdersServiceImpl implements OrdersService{
	//创建一个成员变量OrdersDao
	OrdersDao ordersDao = new OrdersDaoImpl();
	OrderdetailDao orderdetailDao=new OrderdetailDaoImp();
	
	@Override
	/**
	 * 添加订单
	 * @param orders 订单对象
	 * @return 操作成功;false 操作失败
	 */
	public boolean addOrders(Orders orders) {
		// 如果订单为空，不执行订单添加到数据库的操作。
		if (orders == null) {
			return false;
		}
		
		boolean flag = ordersDao.addOrders(orders);
		return flag;
	}

	@Override
	/**
	 * 删除订单
	 * @param orders 订单对象
	 * @return 操作成功;false 操作失败
	 */
	public boolean delOrders(Orders orders) {
		// 如果订单为空，不执行订单删除的操作。
		if (orders == null) {
			return false;
		}
		boolean flag = ordersDao.delOrders(orders);
		return flag;
	}
	
	@Override
	/**
	 * 修改订单(订单状态)
	 * @param orders 订单对象
	 * @return 操作成功;false 操作失败
	 */
	public boolean updateOrdersByOrderstatus(Orders orders) {
		if (orders ==null) {
			return false;
		}
		boolean flag = ordersDao.updateOrdersByOrderstatus(orders);
		return flag;
	}

	@Override
	/**
	 * 修改订单(送达时间)
	 * @param orders 订单对象
	 * @return 操作成功;false 操作失败
	 */
	public boolean updateOrdersByEndtime(Orders orders) {
		if (orders ==null) {
			return false;
		}
		boolean flag = ordersDao.updateOrdersByEndtime(orders);
		return flag;
	}
	@Override
	/**
	 * 查询订单信息(店家)
	 * @param store 店家
	 * @return null 查无信息;list 查询结果
	 */
	public List<Orders> getOrdersByStore(String store) {
		// TODO Auto-generated method stub
		return ordersDao.getOrdersByStore(store);
	}
	@Override
	/**
	 * 查询订单信息(店家)分页
	 * @param page 页数
	 * @param pageSize 单页数据
	 * @param store 店家
	 * @return null 查无信息;list 查询结果
	 */
	public PageData<Orders> getOrdersByStorePage(int page, int pageSize, String store) {
		if(page<1) {
			page=1;
		}
		return ordersDao.getOrdersByStorePage(page, pageSize, store);
	}
	@Override
	/**
	 * 查询订单信息(用户编号)
	 * @param userid 用户编号
	 * @return null 查无信息;list 查询结果
	 */
	public List<Orders> getOrdersByUserid(int userid) {
		// TODO Auto-generated method stub
		return ordersDao.getOrdersByUserid(userid);
	}
	/**
	 * 查询订单信息(用户编号)分页
	 * @param page 页数
	 * @param pageSize 单页数据
	 * @param userid 用户编号
	 * @return null 查无信息;list 查询结果
	 */
	@Override
	public PageData<Orders> getOrdersByUseridPage(int page, int pageSize, int userid) {
		// TODO Auto-generated method stub
		if(page<1) {
			page=1;
		}
		return ordersDao.getOrdersByUseridPage(page, pageSize, userid);
	}
	@Override
	/**
	 * 查询订单信息(订单状态关键字)
	 * @param keywords 订单状态关键字
	 * @return null 查无信息;list 查询结果
	 */
	public List<Orders> getOrdersByOrderstatus(String keywords) {
		// TODO Auto-generated method stub
		return ordersDao.getOrdersByOrderstatus(keywords);
	}
	@Override
	/**
	 * 查询订单信息(订单状态关键字)分页
	 * @param page 页数
	 * @param pageSize 单页数据
	 * @param keywords 订单状态关键字
	 * @return null 查无信息;list 查询结果
	 */
	public PageData<Orders> getOrdersByOrderstatusPage(int page, int pageSize, String keywords) {
		// TODO Auto-generated method stub
		if(page<1) {
			page=1;
		}
		return ordersDao.getOrdersByOrderstatusPage(page, pageSize, keywords);
	}
	@Override
	/**
	 * 查询订单信息(订单编号)
	 * @param store 店家
	 * @return null 查无信息;list 查询结果
	 */
	public List<Orders> getOrdersByOrderid(String orderid) {
		// TODO Auto-generated method stub
		
		if (ordersDao.getOrdersByOrderid(orderid) == null) {
			// 数据库有记录，直接返回false
			return null;
		}
		return ordersDao.getOrdersByOrderid(orderid);
	}
	/**
	 * 增加订单与订单详情
	 * @param orders 订单对象
	 * @param orderdetail 订单详情
	 * @return true 操作成功;false 操作失败
	 */
	@Override
	public boolean addOrdersAndOrderdetail(Orders orders, Cart cart) {
		// jdbc的连接对象 来定义事务的边界和处理
		Connection conn = DBTools.getConn();
		boolean flag = false;
		try {
			//1 连接对象有一个方法,设置事务不自动提交
			conn.setAutoCommit(false);
			//添加订单
			int n1 = ordersDao.addOrders(conn, orders);
			
			//添加订单详情
			int n2 = 0;
			Orderdetail Item =null;
			HashMap<Integer, Orderdetail> orderItem = cart.getCartItems();
			for (Entry<Integer, Orderdetail> orderdetail : orderItem.entrySet()) {
				Item = new Orderdetail(orders.getOrderid(), orderdetail.getValue().getCount(), orderdetail.getValue().getFoods(), orderdetail.getValue().getTotal());
				n2 += orderdetailDao.addorderdetail(conn, Item);
			}
			System.out.println("n1: "+n1+" ,n2: "+n2);
			flag = (n1 > 0 && n2 >= orderItem.size());
			
			// 2-1 事务提交 :连接对象.commit
			if (flag) {
				conn.commit();
				System.out.println("事务提交，转账成功!");
			} else {
				System.out.println("事务自动回滚!");
				conn.rollback();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 2-2 事务的回滚
			try {
				conn.rollback();
				System.out.println("事务自动回滚!");
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally {

			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		return flag;
	}

	
	@Override
	public PageData<Orders> getOrdersByStoreByPage(int page, int pageSize, String keywords) {
		// 如果输入的页码为负数，那么默认显示第一页
				if (page < 1) {
					page = 1;
				}
				return ordersDao.getOrdersByStoreByPage(page, pageSize, keywords);
			}

	@Override
	public boolean delOrdersById(String orderid) {
		// TODO Auto-generated method stub
		if (orderid==null) {
			return false;
		}
		boolean flag = ordersDao.delOrdersById(orderid);
		return flag;
	}

	@Override
	public boolean updateOrders(Orders orders) {

				if (orders ==null) {
					return false;
				}

				 return ordersDao.updateOrders(orders);
			

	}
	

}
